/*
Copyright (C) 2008 raohmaru <http://www.raohmaru.com>

This file is part of Raohmaru AS3 Framework.

Raohmaru AS3 Framework is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Raohmaru AS3 Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with Raohmaru AS3 Framework.  If not, see <http://www.gnu.org/licenses/>.
*/

package jp.raohmaru.net 
{
import flash.display.Loader;
import flash.events.*;
import flash.net.URLRequest;
import flash.system.LoaderContext;

/**
 * Se distribuye cuando los datos se han cargado correctamente. El evento <code>complete</code> siempre se distribuye después del evento <code>init</code>.
 * @eventType flash.events.Event.COMPLETE
 */
[Event(name="complete", type="flash.events.Event") ]

/**
 * Se distribuye cuando se produce un error de entrada o salida que provoca que una operación de carga se realice incorrectamente.
 * @eventType flash.events.IOErrorEvent.IO_ERROR
 */
[Event(name="ioError", type="flash.events.IOErrorEvent") ]

/**
 * Se distribuye cuando se realiza una solicitud de red a través de HTTP y Flash Player puede detectar el código de estado HTTP.
 * @eventType flash.events.HTTPStatusEvent.HTTP_STATUS
 */
[Event(name="httpStatus", type="flash.events.HTTPStatusEvent") ]

/**
 * Se distribuye cuando se inicia la operación de carga.
 * @eventType flash.events.Event.OPEN
 */
[Event(name="open", type="flash.events.Event") ]

/**
 * Se distribuye al recibirse datos mientras progresa una operación de descarga.
 * @eventType flash.events.ProgressEvent.PROGRESS
 */
[Event(name="progress", type="flash.events.ProgressEvent") ]

/**
 * Se distribuye cuando las propiedades y métodos de un archivo SWF cargado están accesibles.
 * @eventType flash.events.Event.INIT
 */
[Event(name="init", type="flash.events.Event") ]

/**
 * Se distribuye mediante un objeto LoaderInfo cuando un objeto cargado se elimina utilizando el método <code>unload()</code> del objeto Loader o cuando el mismo
 * objeto Loader realiza una segunda carga y el contenido original se elimina antes de que comience la carga. 
 * @eventType flash.events.Event.UNLOAD
 */
[Event(name="unload", type="flash.events.Event") ]

/**
 * Clase proxy para cargar y visualizar archivos externos (swf o de imagen). Crea una contenedor que luego debe añadirse a la lista de visualización.<br><br>
 * En el ejemplo siguiente se carga una imagen externa con <code>FileLoader.fload()</code> y se le registra el evento <code>Event.COMPLETE</code>; a continuación
 * se genera un Bitmap con el objeto de visualización que se cargó (<code>content</code>), y finalmente se descarga (se elimina  el elemento secundario del objeto
 * FileLoader) con el método heredado <code>Loader.unload()</code>.
 * @example
<listing version="3.0">
import flash.display.*;import flash.events.Event;import jp.raohmaru.net.FileLoader;

var floader :FileLoader = new FileLoader();
	floader.addEventListener(Event.COMPLETE, onPicLoad);	floader.addEventListener(IOErrorEvent.IO_ERROR, onError);
	floader.fload("http://www.adobe.com/lib/com.adobe/template/gnav/adobe-hq.png");
	
function onPicLoad(e :Event) : void
{
	var bmd:BitmapData = new BitmapData(e.target.content.width, e.target.content.height, false, 0xFFFFFF);
		bmd.draw(e.target.content);
	addChild( new Bitmap(bmd, "auto", true) );
	
	FileLoader(e.target).unload();
	e.target.removeEventListener(Event.COMPLETE, onPicLoad);
	e.target.removeEventListener(IOErrorEvent.IO_ERROR, onError);
}function onError(e :IOErrorEvent) : void
{	
	// ...
}</listing>
 * @see flash.display.Loader
 * @author raohmaru
 * @version 1.0
 */
public class FileLoader extends Loader 
{
	/**
	 * Obtiene el progreso de la descarga (0 -> nada descargado, 1 -> 100% descargado)
	 */
	public function get loaded() : Number
	{
		return contentLoaderInfo.bytesLoaded/contentLoaderInfo.bytesTotal;
	}
	
	/**
	 * Nuevo FileLoader que puede añadirse a la lista de visualización.
	 */	
	public function FileLoader()
	{
		contentLoaderInfo.addEventListener(Event.OPEN, eventHandler);
		contentLoaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS, eventHandler);
		contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, eventHandler);
		contentLoaderInfo.addEventListener(Event.COMPLETE, eventHandler);
		contentLoaderInfo.addEventListener(Event.INIT, eventHandler);
		contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, eventHandler);
		contentLoaderInfo.addEventListener(Event.UNLOAD, eventHandler);
	}
	
	/**
	 * Carga un archivo externo (archivos SWF, JPEG, JPEG progresivo, GIF sin animar o PNG).
	 * @param file URL del archivo
	 * @param context Un objeto LoaderContext
	 * @see flash.display.Loader#load()
	 */
	public function fload(file : String, context : LoaderContext = null) : void
	{
		load( new URLRequest(file), context );
	}
		
	private function eventHandler(e : Event) : void
	{
		dispatchEvent(e);
	}
}
}